package cn.myproject.articletype.service.impl;

import cn.myproject.articletype.domian.ArticleType;
import cn.myproject.articletype.mapper.ArticleTypeMapper;
import cn.myproject.articletype.query.ArticleTypeQuery;
import cn.myproject.articletype.service.IArticleTypeservice;
import cn.myproject.vo.ArticleTypeTree;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ArticleTypeserviceImpl implements IArticleTypeservice {
    @Autowired
    private ArticleTypeMapper articleTypeMapper;

    //新增
    @Override
    @CacheEvict(cacheNames = "ArticleType",key = "'Tree'")
    public void addArticleType(ArticleType articleType) {
        articleTypeMapper.addArticleType(articleType);
    }
    //修改
    @Override
    @CacheEvict(cacheNames = "ArticleType",key = "'Tree'")
    public void updata(ArticleType articleType) {
        articleTypeMapper.updata(articleType);
    }
    //查询一个按照id
    @Override
    public ArticleType selectByid(Long id) {
        return articleTypeMapper.selectByid(id);
    }
    //分页查询
    @Override
    public PageInfo<ArticleType> selectAll(ArticleTypeQuery articleTypeQuery) {
        PageHelper.startPage(articleTypeQuery.getCurrentPage(), articleTypeQuery.getPageSize());
        //按名字进行条件查询
        List<ArticleType> list = articleTypeMapper.selectbyName(articleTypeQuery);
        PageInfo<ArticleType> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }
    //批量删除
    @Override
    @CacheEvict(cacheNames = "ArticleType",key = "'Tree'")
    public void delectall(List<Long> ids) {
        articleTypeMapper.delectall(ids);

    }
    //按id删除
    @Override
    @CacheEvict(cacheNames = "ArticleType",key = "'Tree'")
    public void delectByid(Long id) {
        articleTypeMapper.delectByid(id);
    }

    @Override
    @Cacheable(cacheNames = "ArticleType",key = "'Tree'")
    public List<ArticleTypeTree> tree() {
        //要返回给前端的顶级数组
        List<ArticleTypeTree> top = new ArrayList<>();
        //查出所有数据并用一个数组装起来
       List<ArticleTypeTree> all = articleTypeMapper.all();
       /*
       * 将数据赋值给一个map，方便后续查找,map的键值为<key为自己的id,value为自己的对象>,
       * 这样自己的儿子可以通过parentId找到父亲的id(因为父亲id和儿子的parentId是一样的)，拿到父亲的对象
       * */
       Map<Long,ArticleTypeTree> map = all.stream().collect(Collectors.toMap(ArticleTypeTree::getId,tmp->tmp));
       //为了方便后续查找父亲，把一个数组转化为map。
        //找到所有的顶级父类，并把它装入顶级数组
        for (ArticleTypeTree type : all) {
            //判断parentId为空就是顶级父类
            if (type.getParentId() == null){
                //为父类的对象赋值
             top.add(type);
                //装入数组
            }else {
                //如果不是顶级父类就找到自己的父亲
              ArticleTypeTree parent = map.get(type.getParentId());
              //自己的父亲又把自己加入到children里
              parent.getChildren().add(type);
            }
        }
        return top;
    }
}
